package com.wyh.service.serviceImpl.feemanagementserviceimpl;


import com.wyh.common.constant.Constants;
import com.wyh.domain.dto.feemanagementdto.MailMessageDto;
import com.wyh.domain.vo.feemanagementvo.MessageVo;
import com.wyh.service.feemanagementservice.MailService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.FileSystemResource;
import org.springframework.mail.MailException;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service;

import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Objects;

/**
 * @ClassName： MailServiceImpl.java
 * @ClassPath： com.tanersci.service.impl.MailServiceImpl.java
 * @Description： 邮件
 * @Author： tanyp
 * @Date： 2021/6/7 9:18
 **/
@Slf4j
@Service
public class MailServiceImpl implements MailService {

    @Value("${spring.mail.username}")
    private String sender;

    @Autowired
    private JavaMailSender javaMailSender;

    /**
     * @MonthName： sendSimple
     * @Description： 普通邮件发送
     * @Author： tanyp
     * @Date： 2021/6/7 9:30
     * @Param： [dto]
     * @return： void
     **/
    @Override
    public MessageVo sendSimple(String[] emails) {
        List<String> failedEmails = new ArrayList<>();
        for (String email : emails) {
            try {
                // 构建一个邮件对象
                SimpleMailMessage message = new SimpleMailMessage();
                // 设置邮件主题
                message.setSubject("账单通知");
                // 设置邮件发送者，这个跟application.yml中设置的要一致
                message.setFrom(sender);
                // 设置邮件接收者
                message.setTo(email);

//                // 设置邮件抄送人，可以有多个抄送人
//                if (Objects.nonNull(dto.getCc())) {
//                    message.setCc(dto.getCc());
//                }
//
//                // 设置隐秘抄送人，可以有多个
//                if (Objects.nonNull(dto.getBcc())) {
//                    message.setBcc(dto.getBcc());
//                }

                // 设置邮件发送日期
                message.setSentDate(new Date());
                // 设置邮件的正文
                message.setText("账单欠费通知");
                // 发送邮件
                javaMailSender.send(message);
                log.info("邮件发送成功：{}", email);
            } catch (MailException e) {
                log.error("邮件发送失败：{}，异常：{}", email, e);
                failedEmails.add(email);
            }
        }
        if (failedEmails.isEmpty()) {
            return MessageVo.builder().code(Constants.NEWS_SUCCESS_CODE).message(Constants.NEWS_SUCCESS_MESSAGE).build();
        } else {
            return MessageVo.builder()
                    .code(Constants.NEWS_FAIL_MESSAGE)
                    .message("部分邮件发送失败: " + String.join(", ", failedEmails))
                    .build();
        }
    }


    /**
     * @MonthName： sendAttachFile
     * @Description： 带附件的邮件
     * @Author： tanyp
     * @Date： 2021/6/7 9:30
     * @Param： [dto]
     * @return： void
     **/
    @Override
    public MessageVo sendAttachFile(MailMessageDto dto) {
        try {

            MimeMessage mimeMessage = javaMailSender.createMimeMessage();
            // true表示构建一个可以带附件的邮件对象
            MimeMessageHelper message = new MimeMessageHelper(mimeMessage, true);
            message.setSubject(dto.getSubject());
            message.setFrom(sender);
            message.setTo(dto.getRecipient());
            if (Objects.nonNull(dto.getCc())) {
                message.setCc(dto.getCc());
            }
            if (Objects.nonNull(dto.getBcc())) {
                message.setBcc(dto.getBcc());
            }
            message.setSentDate(new Date());
            message.setText(dto.getText());

            // 第一个参数是自定义的名称，后缀需要加上，第二个参数是文件的位置
            dto.getAttachments().forEach(file -> {
                try {
                    message.addAttachment(file.getName(), file);
                } catch (MessagingException e) {
                    log.error("=========邮件附件解析异常：{}", e);
                }
            });

            javaMailSender.send(mimeMessage);
            log.info("=======带附件的邮件结束");
            return MessageVo.builder().code(Constants.NEWS_SUCCESS_CODE).message(Constants.NEWS_SUCCESS_MESSAGE).build();
        } catch (MessagingException e) {
            log.error("==========邮件====sendAttachFile=====异常：{}", e);
            return MessageVo.builder().code(Constants.NEWS_FAIL_CODE).message(Constants.NEWS_FAIL_MESSAGE).build();
        }
    }

    /**
     * @MonthName： sendImgRes
     * @Description： 带图片资源的邮件
     * @Author： tanyp
     * @Date： 2021/6/7 9:30
     * @Param： [dto]
     * @return： void
     **/
    @Override
    public MessageVo sendImgRes(MailMessageDto dto) {
        try {

            MimeMessage mimeMessage = javaMailSender.createMimeMessage();
            MimeMessageHelper message = new MimeMessageHelper(mimeMessage, true);
            message.setSubject(dto.getSubject());
            message.setFrom(sender);
            message.setTo(dto.getRecipient());
            if (Objects.nonNull(dto.getCc())) {
                message.setCc(dto.getCc());
            }
            if (Objects.nonNull(dto.getBcc())) {
                message.setBcc(dto.getBcc());
            }
            message.setSentDate(new Date());
            message.setText(dto.getText());

            // 第一个参数指的是html中占位符的名字，第二个参数就是文件的位置
            dto.getAttachments().forEach(file -> {
                try {
                    message.addInline(file.getName(), new FileSystemResource(file));
                } catch (MessagingException e) {
                    log.error("=========邮件图片解析异常：{}", e);
                }
            });
            javaMailSender.send(mimeMessage);
            log.info("=======带图片资源的邮件结束");
            return MessageVo.builder().code(Constants.NEWS_SUCCESS_CODE).message(Constants.NEWS_SUCCESS_MESSAGE).build();
        } catch (MessagingException e) {
            log.error("====邮件====sendImgRes=====异常：{}", e);
            return MessageVo.builder().code(Constants.NEWS_FAIL_CODE).message(Constants.NEWS_FAIL_MESSAGE).build();
        }
    }

}

